﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TinyPG
{
    public class Element
    {
        private int _rangH;
        private int _rangV;
        protected bool _isInit;
        public List<Element> _nextElement;
        public List<Element> _prevElement;
        public Branche _branche;
        private bool _affecté;
        public List<string> _listActions;

        public Element()
        {
            _rangH = -1;
            _rangV = -1;
            _nextElement = new List<Element>();
            _prevElement = new List<Element>();
            _branche = new Branche(false);
            _affecté = false;
            _listActions = new List<string>();
        }

        public bool GetInit()
        {
            return _isInit;
        }

        public bool GetAffecté()
        {
            return _affecté;
        }

        public void AppartientA(Branche B)
        {
            _branche = B;
            _affecté = true;
        }
        public Branche GetBranche()
        {
            return _branche;
        }

        public int GetRangH()
        {
            return _rangH;
        }

        public int GetRangV()
        {
            return _rangV;
        }

        public void SetRangH(int RangH)
        {
            _rangH = RangH;
        }

        public void SetRangV(int RangV)
        {
            _rangV = RangV;
        }

        public void AjouterNextElement(Element E)
        {
            _nextElement.Add(E);
        }
        public void AjouterPrevElement(Element E)
        {
            _prevElement.Add(E);
        }

        public void DefineStructure()
        {
            if (_nextElement.Count == 1 && _nextElement[0]._prevElement.Count == 1)
            {
                if (!_nextElement[0].GetAffecté())
                {
                    _branche.AddElement(_nextElement[0]);
                    _nextElement[0].AppartientA(_branche);
                    _nextElement[0].DefineStructure();
                }
                else
                {
                    Branche B = new Branche(true);
                    B._listBranchePrev.Add(_branche);
                    _branche._listBrancheNext.Add(B);

                    _nextElement[0].GetBranche()._listBrancheRetourAmont.Add(B);
                    B.AddVersBrancheRetour(_nextElement[0].GetBranche());
                    Document.Doc._listeLesBranches.Add(B);

                }

                return;
            }
            else
            {
                foreach (Element E in _nextElement)
                {
                    if (E.GetAffecté() == false)
                    {
                        Branche BrNoeud = new Branche(true);
                        BrNoeud.AddBranchePrev(_branche);
                        _branche.AddBrancheNext(BrNoeud);


                        Branche B = new Branche(false);
                        B.AddBranchePrev(BrNoeud);
                        BrNoeud.AddBrancheNext(B);

                        Document.Doc._listeLesBranches.Add(BrNoeud);

                        B.AddElement(E);
                        E.AppartientA(B);
                        E.DefineStructure();

                        Document.Doc._listeLesBranches.Add(B);
                    }
                    else
                    {
                        Branche B = new Branche(true);
                        B._listBranchePrev.Add(_branche);
                        _branche._listBrancheNext.Add(B);

                        E.GetBranche()._listBrancheRetourAmont.Add(B);
                        B.AddVersBrancheRetour(E.GetBranche());
                        Document.Doc._listeLesBranches.Add(B);
                    }

                }
                return;

            }


        }
    }
}
